/**
 * 如果数据的存储顺序不重要 也不必对数据进行查找，那么列表就是一种合适的数据结构
 */
class List {
  constructor() {
    this.listSize = 0;
    this.pos = 0;
    this.dataStore = [];
  }
  // 给列表添加元素
  append(element) {
    this.dataStore[this.listSize++] = element;
  }
  // 从列表中删除元素
  remove(element) {
    const findAt = this.find(element);
    if (findAt > -1) {
      this.dataStore.splice(findAt, 1);
      this.listSize--;
      return true;
    }
    return false;
  }
  // 查找元素
  find(element) {
    for (let index = 0; index < this.dataStore.length; index++) {
      const current = this.dataStore[index];
      if (element === current) return index;
    }
    return -1
  }
  //列表长度
  length() {
    return this.listSize;
  }
  //显示列表元素
  toString() {
    return this.dataStore;
  }
  // 清空列表中的所有元素
  clear() {
    this.dataStore = [];
    this.listSize = this.pos = 0;
  }
  // 插入一个元素
  // 这里的插入是插入某个元素之后而不是某个数组下标之后
  insert(element, after) {
    const insertPos = this.find(after);
    if (insertPos > -1) {
      this.dataStore.splice(insertPos, 0, element);
      this.listSize++;
      return true;
    }
    return false;
  }
  //判断列表是否包含某个元素
  contains(element) {
    for (let index = 0; index < this.dataStore.length; index++) {
      if (element === this.dataStore[index]) return true;
    }
    return false
  }
  // 遍历列表的方法
  front() {
    this.pos = 0;
  }
  end() {
    this.pos = this.listSize - 1;
  }
  prev() {
    if (this.pos > 0) {
      --this.pos;
    }
  }
  next() {
    if (this.pos < this.listSize - 1) {
      ++this.pos;
    }
  }
  curpos() {
    return this.pos;
  }
  moveTo(position) {
    this.pos = position;
  }
  // 返回当前元素
  getElement() {
    return this.dataStore[this.pos];
  }
}
//显示列表
function displayList(list) {
  for (list.front(); list.curpos() <= list.length() - 1; list.next()) {
    if (list.getElement() instanceof Customer) {
      //客户
      console.log(list.getElement()["name" + "" + list.getElement()["movie"]]);
    } else {
      // 电影清单
      console.log(list.getElement());
    }
    if (list.curpos() === list.length() - 1) break;
  }
}
module.exports = List;

// =======================TEST=======================
// let names = new List()
// names.append("chentao")
// names.append("mazhuang")
// names.append("liujian")

/**
 * 这里作者又埋了bug，next函数返回的最大值是dataStore长度减1的值.但退出循环必须大于这个数组的长度才会退出。
 * 这里永远不会满足退出的条件，所以这里的迭代器有要在每次循环中判断curPos是否是最后一个值，是的话就退出
 */
// 使用迭代器访问列表
// for(names.front();names.curpos()<=names.length()-1;names.next()){
//   console.log("--------currentEle",names.getElement());
//   if(names.curpos() === names.listSize-1) break
// }
